home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiscKit1.7.1 / MiscKit / Examples / ScrollDir / NameCache.m < prev    next >
Text File  |  1996-02-08  |  5KB  |  184 lines

  1. //=============================================================================
  2. //
  3. //        Copyright (C) 1995,1996 by Paul S. McCarthy and Eric Sunshine.
  4. //                Written by Paul S. McCarthy and Eric Sunshine.
  5. //                            All Rights Reserved.
  6. //
  7. //        This notice may not be removed from this source code.
  8. //
  9. //        This object is included in the MiscKit by permission from the authors
  10. //        and its use is governed by the MiscKit license, found in the file
  11. //        "License.rtf" in the MiscKit distribution.    Please refer to that file
  12. //        for a list of all applicable permissions and restrictions.
  13. //
  14. //=============================================================================
  15. //-----------------------------------------------------------------------------
  16. // NameCache.m
  17. //
  18. //        Data structure and routines for caching user names and group names.
  19. //
  20. //-----------------------------------------------------------------------------
  21. //-----------------------------------------------------------------------------
  22. // $Id$
  23. // $Log$
  24. //-----------------------------------------------------------------------------
  25.  
  26. #import "NameCache.h"
  27. #import <grp.h>
  28. #import <pwd.h>
  29.  
  30. static NXZone* theZone = 0;
  31.  
  32.  
  33. //-----------------------------------------------------------------------------
  34. // store_string
  35. //-----------------------------------------------------------------------------
  36. static char const* store_string( char const* s )
  37.     {
  38.     char* t = 0;
  39.     if (s != 0)
  40.         t = NXCopyStringBufferFromZone( s, theZone );
  41.     return t;
  42.     }
  43.  
  44.  
  45. //-----------------------------------------------------------------------------
  46. // str_int
  47. //-----------------------------------------------------------------------------
  48. static char const* str_int( int x )
  49.     {
  50.     static char buff[ 32 ];
  51.     sprintf( buff, "%d", x );
  52.     return buff;
  53.     }
  54.  
  55.  
  56.  
  57. //=============================================================================
  58. // NAME CACHE
  59. //=============================================================================
  60. @implementation NameCache
  61. //-----------------------------------------------------------------------------
  62. // + initialize
  63. //-----------------------------------------------------------------------------
  64. + initialize
  65.     {
  66.     if (theZone == 0)
  67.         {
  68.         theZone = NXCreateZone( vm_page_size, vm_page_size, NO );
  69.         }
  70.     return self;
  71.     }
  72.  
  73.  
  74. //-----------------------------------------------------------------------------
  75. // - init
  76. //-----------------------------------------------------------------------------
  77. - init
  78.     {
  79.     [super init];
  80.     table = [[HashTable alloc] initKeyDesc:"i" valueDesc:"*"];
  81.     return self;
  82.     }
  83.  
  84.  
  85. //-----------------------------------------------------------------------------
  86. // - resolve:
  87. //-----------------------------------------------------------------------------
  88. - (char const*) resolve:(int)x
  89.     {
  90.     [self subclassResponsibility:_cmd];
  91.     return 0;
  92.     }
  93.  
  94.  
  95. //-----------------------------------------------------------------------------
  96. // - store:
  97. //-----------------------------------------------------------------------------
  98. - (char const*) store:(int)ident
  99.     {
  100.     char const* name = store_string( [self resolve:ident] );
  101.     [table insertKey:(void const*)ident value:(void*)name];
  102.     return name;
  103.     }
  104.  
  105.  
  106. //-----------------------------------------------------------------------------
  107. // - lookup:
  108. //-----------------------------------------------------------------------------
  109. - (char const*) lookup:(int)ident
  110.     {
  111.     char const* name = 0;
  112.     if ([table isKey:(void const*)ident])
  113.         name = [table valueForKey:(void const*)ident];
  114.     else
  115.         name = [self store:ident];
  116.     return name;
  117.     }
  118.  
  119. @end
  120.  
  121.  
  122. //=============================================================================
  123. // OWNER CACHE
  124. //=============================================================================
  125. @implementation OwnerCache
  126. //-----------------------------------------------------------------------------
  127. // - resolve:
  128. //-----------------------------------------------------------------------------
  129. - (char const*) resolve:(int)uid
  130.     {
  131.     char const* s = 0;
  132.     struct passwd const* const pw = getpwuid( uid );
  133.     if (pw != 0)
  134.         s = pw->pw_name;
  135.     else
  136.         s = str_int( uid );
  137.     return s;
  138.     }
  139.  
  140.  
  141. //-----------------------------------------------------------------------------
  142. // + commonInstance
  143. //-----------------------------------------------------------------------------
  144. + commonInstance
  145.     {
  146.     static id obj = 0;
  147.     if (obj == 0)
  148.         obj = [[self allocFromZone:theZone] init];
  149.     return obj;
  150.     }
  151. @end
  152.  
  153.  
  154. //=============================================================================
  155. // GROUP CACHE
  156. //=============================================================================
  157. @implementation GroupCache
  158. //-----------------------------------------------------------------------------
  159. // - resolve:
  160. //-----------------------------------------------------------------------------
  161. - (char const*) resolve:(int)gid
  162.     {
  163.     char const* s = 0;
  164.     struct group const* const gr = getgrgid( gid );
  165.     if (gr != 0)
  166.         s = gr->gr_name;
  167.     else
  168.         s = str_int( gid );
  169.     return s;
  170.     }
  171.  
  172.  
  173. //-----------------------------------------------------------------------------
  174. // + commonInstance
  175. //-----------------------------------------------------------------------------
  176. + commonInstance
  177.     {
  178.     static id obj = 0;
  179.     if (obj == 0)
  180.         obj = [[self allocFromZone:theZone] init];
  181.     return obj;
  182.     }
  183. @end
  184.